**
一、创建myFilter类实现Filter接口
**
二、在web.xml中配置过滤器
<!-- 配置过滤器 -->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.facai.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
三、过滤器实现统一编码格式
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//设置请求编码格式
request.setCharacterEncoding("utf-8");
//设置响应编码格式
response.setCharacterEncoding("text/html;charset=utf-8");
//放行
chain.doFilter(request, response);
}
四、过滤器实现session管理
在过滤器中获取session对象,然后查看session中的数据是否还在。
如果没有数据,则因为session失效重定向到登录页面
如果session有数据,则放行。
问题1:
在过滤器中使用session校验后发现登录页面访问成了死循环,因为登录页面的请求也就是login.jsp也会被过滤器拦截,此时的session中没有user的数据所以再次重定向到登录页面。
解决1:
对login.jsp和登录请求进行放行
问题2:
过滤器会拦截所有的请求,包括静态资源(css文件/js文件/image图片)请求,造成页面的样式和动态效果出不来
解决2:
对静态资源放行
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//设置请求编码格式
request.setCharacterEncoding("utf-8");
//设置响应编码格式
response.setCharacterEncoding("text/html;charset=utf-8");
//强转request对象
HttpServletRequest req=((HttpServletRequest)request);
//强转response对象
HttpServletResponse resp=((HttpServletResponse)response);
//获取此次请求uri
String uri=req.getRequestURI();
//获取此次请求的method
String method=req.getParameter("method");
//放行登录页面,放行登录请求,放行静态资源请求
if("/project2/login.jsp".equals(uri)||"/project2/data".equals(uri)&&"userLogin".equals(method)||uri.startsWith("/project2/css/")||uri.startsWith("/project2/js/")||uri.startsWith("/project2/images/")){
//放行
chain.doFilter(request, response);
}else{
//session管理,统一session校验
//获取session对象
HttpSession session=req.getSession();
Object obj=session.getAttribute("user");
//判断
if(obj!=null){
//放行
chain.doFilter(request, response);
}else{
//重定向
resp.sendRedirect("/project2/login.jsp");
}
}
}
问题3:
当session失效时,重定向会出现这个效果:
解决:
在login.jsp中加入
<!-- 声明js代码域 -->
<script type="text/javascript">
//判断login页面是否为顶层页面,如果不是则将其设置为顶层页面(解决框架中出现登录页面)
if(window!=top){
top.location.href=location.href;
}
</script>
五、过滤器实现权限管理
需求:
不同用户在对同一功能使用时,有的用户可以直接使用,有的用户显示权限不足。
思路:
1、在数据库中创建一个url权限表,该表储存了该系统需要被管理的URL;
2、在数据库中创建用户权限中间表,进行权限分配;
3、在数据库中对用户进行权限分配;
4、用户登录成功后查询该用户具备的url权限,存储到到该用户的session中;
5、在过滤器中对当前发起请求的用户的请求地址发起校验,校验该用户是否具有该请求地址的权限,如果具备则执行放行,如果不具备则提示权限不足
数据库设计:
1)URL权限表:t_url
编号:urlid
url地址:location
描述:remark
2)用户中间权限表:t_user_url
用户id:uid
权限id:urlid
3)SQL语句设计
查询当前登录用户url权限
子查询: select * from t_url where urlid in (select urlid from t_user_url where uid=8);
联合查询:select * from t_url tu ,t_user_url tul where tu.urlid=tul.urlid and tul.uid=8;
##创建url权限表
create table t_url (
urlid int(50) not null auto_increment,
location varchar(100) not null,
remark varchar(500),
primary key(urlid)
)
##创建url和用户之间的中间表
create table t_user_url(
uid int(10) not null,
urlid int(10) not null
)
##添加url到表中
INSERT into t_url values(default,'selUserInfo',null);
INSERT into t_url values(default,'delUserInfo',null);
INSERT into t_url values(default,'userOut',null);
INSERT into t_url values(default,'/project2/main.jsp',null);
select * from t_user
select * from t_user_url
##分配权限给用户
insert into t_user_url values(8,1);
insert into t_user_url values(8,2);
insert into t_user_url values(8,3);
insert into t_user_url values(8,4);
insert into t_user_url values(2,1);
insert into t_user_url values(2,3);
insert into t_user_url values(2,4);
select * from t_url tu ,t_user_url tul where tu.urlid=tul.urlid and tul.uid=8;
这里注意:用户登录时跳转的是一个jsp页面不是没有method,需要在放行登录请求后放行登录页面
//获取此次请求的method
String method=req.getParameter("method");
//放行登录页面,放行登录请求,放行静态资源请求
if("/project2/login.jsp".equals(uri)||"/project2/data".equals(uri)&&"userLogin".equals(method)||uri.startsWith("/project2/css/")||uri.startsWith("/project2/js/")||uri.startsWith("/project2/images/")){
//放行
chain.doFilter(request, response);
}else{
//session管理,统一session校验
//获取session对象
HttpSession session=req.getSession();
Object obj=session.getAttribute("user");
//判断
if(obj!=null){
//获取权限
List<Url> lu=(List<Url>) session.getAttribute("lu");
//权限校验
for(Url url:lu){
if(url.getLocation().equals(method)||url.getLocation().equals(uri)){
//放行
chain.doFilter(request, response);
return;
}
}
//响应
resp.getWriter().write("HAVEN'T POWER");
return;
}else{
//重定向
resp.sendRedirect("/project2/login.jsp");
}
}
}