您的位置:首页 > 编程语言 > Java开发

java过滤器原理分析以及实现,通过过滤器实现自动登陆

2017-10-31 23:12 621 查看
1、过滤器

1、过滤器

1.1、过滤器的原理

1、Filter过滤器,
□   它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

□   它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理


1.2、过滤器的配置

<filter>指定一个过滤器。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空</filter-name>
<filter-class>元素用于指定过滤器的完整的限定类名。</filter-class>
<init-param>元素用于为过滤器指定初始化参数
<param-name>指定参数的名字</param-name>
<param-value>指定参数的值</param-value>
</init-param> 在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
<init-param>元素用于为过滤器指定初始化参数
<param-name>指定参数的名字</param-name>
<param-value>指定参数的值</param-value>
</init-param> 在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
</filter>
<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>子元素用于设置filter的注册名称</filter-name>
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)</url-pattern>
</filter-mapping>


1.3、过滤器的生命周期

当web容器启动的时候,自动调用过滤器的init(FilterConfig arg0)方法来对filter进行初始化,当web关闭,关机,或者reload整个应用时,都会调用destroy()来关闭filter。在容器存活期间,filter过滤器一直是存活的。


1.4、过滤器的自动登陆实现

//1、如果session中存在user,直接放行
//2、如果不存在session,到cookie中获取用户名密码
//2.1如果有用户名密码,到数据库查询是否在
//2.1.1如果存在,存在session中,放行
//2.1.2如果不存在,放行。
//2.2如果用户名密码不存在,放行。

HttpServletRequest req = (HttpServletRequest)request;

User user = (User)req.getSession().getAttribute("user");

//1、如果session中存在user,直接放行
if(user!=null){
chain.doFilter(req, response);
}else{
//session中不存在。到cookie中去查找。ctrl+2   l
Cookie[] cookies = req.getCookies();
String userJson = "";
for (Cookie cookie : cookies) {
if("user".equals(cookie.getName())){
userJson = cookie.getValue();
}
}

//cookie中不存在用户信息
if("".equals(userJson)||userJson==null){
chain.doFilter(req, response);
}else{

//cookie中存在用户信息
user = JsonUtils.jsonToPojo(userJson, User.class);
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from user where username = ? and password =?";
try {
user = qr.query(sql, new BeanHandler<User>(User.class),user.getUsername(),user.getPassword());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

if(user==null){
chain.doFilter(req, response);
}else{
req.getSession().setAttribute("user", user);
chain.doFilter(req, response);
}
}
}


9db1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: