新增过滤器功能:jsp和Servlet的整合项目

**

一、创建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");
		}
		}
		
		
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值