struts权限控制.docx
- 文档编号:23643422
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:15
- 大小:41.69KB
struts权限控制.docx
《struts权限控制.docx》由会员分享,可在线阅读,更多相关《struts权限控制.docx(15页珍藏版)》请在冰豆网上搜索。
struts权限控制
权限验证
(代码中部分删除,保留框架)
1.struts框架安全隐患
使用Struts框架时,权限通常控制在Action级(比如将权限验证放在Action的基类中,这样新的Action都继承于这个Action基类,所有Action就可以专注于业务逻辑,而不需要重复地进行权限控制了),这也符合MVC中的角色划分。
然而,这会产生一个安全隐患。
因为权限控制在Action中,所以,页面也就没有安全屏障了。
一般的新增数据、更新数据不会有什么问题,因为这些数据必须通过HTML的Form提交到Struts的中心控制器,最终由相应的Action来处理,所以Action中就可以验证该用户的权限了。
然而,对于一些不需要Action进行数据存取,或者有的页面没有严格按照MVC的角色划分而在页面中有获取数据的代码,那么这个页面就危险了。
比如,显示一张通知页面,通常可以通过配置权限,使部分授权的用户才可以看到该级别的通知。
这个通知页面是不需要从数据库中获取数据的。
所以,可以不通过Action的调用来显示,而是直接敲入显示该通知的页面的链接就可以看到了。
甚至不需要登录系统,不用管是否有查看该通知的权限!
比如下图中:
请求1:
http:
//.../XXX.do
是通过正常的途径访问的,需要经过权限验证。
而请求2:
http:
//.../XXX.jsp
则完全绕过了权限检查,任何人,不需要登录系统就可以访问到该信息了。
2.解决方案
解决的办法:
采用servlet过滤器
servlet过滤器是小型的web组件,它能够处理传入的请求和传出的响应。
Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response。
它具有高度的透明性,无需更改应用程序代码,就可以根据需要添加、修改或从应用程序中将它删除。
一个filter包括:
1.在servlet被调用之前截获;
2.在servlet被调用之前检查servletrequest;
3.根据需要修改request头和request数据;
4.根据需要修改response头和response数据;
5.在servlet被调用之后截获.
你能够配置一个filter到一个或多个servlet;单个servlet或servlet组能够被多个filter使用。
几个实用的filter包括:
用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLTfilter等。
一个客户化的过滤器要实现Filter接口的三个方法:
init()、destroy()和doFilter()。
1.init():
在容器实例化过滤器时调用,该方法接受一个FilterConfig类型的对象做为输入。
2.destroy():
执行一些清理操作。
3.doFilter():
类似servlet的doPost()、doGet()方法,执行具体的过滤任务。
设置URL拦截器,对截获的请求url(两部分包括XXX.do和XXX.Jsp)做权限验证,具有该权限则继续下一步,否则跳转到相应页面显示用户没有权限。
3.具体步骤
统过滤器配置具体步骤:
1. 首先写一个权限过滤filter类,实现Filter接口
jsp权限过滤器permissionFilter
packagedao;
importjavax.servlet.Filter;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.FilterChain;
importjava.io.IOException;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpSession;
importjavax.servlet.http.HttpServletResponse;
importpo.login;
/*
*jsp安全过滤器
*filter:
permissionFilter
**/
publicclasspermissionFilterimplementsFilter{
//1,doFilter方法的第一个参数为ServletRequest对象。
//此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。
//第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。
//最后一个参数为FilterChain,此参数用来调用servlet或JSP页。
privateFilterConfigfilterConfig;
privateFilterChainchain;
privateHttpServletRequestrequest;
privateHttpServletResponseresponse;
publicvoiddestroy(){
this.filterConfig=null;
}
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
this.filterConfig=filterConfig;
}
publicvoiddoFilter(ServletRequestservletRequest,
ServletResponseservletResponse,FilterChainchain){
this.chain=chain;
this.request=(HttpServletRequest)servletRequest;
//如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法,
//就要把此request对象构造成HttpServletRequest
this.response=((HttpServletResponse)servletResponse);
//获取当前页面文件名此处url为:
/Gzlkh/login.jsp
Stringurl=request.getRequestURI();
//此处截取的url为:
login.jsp
url=url.substring(url.lastIndexOf("/")+1,url.length());
try{
HttpSessionsession=request.getSession();
//获取网站访问根目录
StringaccessPath=request.getContextPath();
//获取用户登录验证信息
loginst=(login)session.getAttribute("st");
if(noFileUrl(url,request)){
//不需要判断权限的请求如登录页面,则跳过
chain.doFilter(request,response);//继续执行请求
}elseif(st==null){
response.sendRedirect(accessPath+"/login.jsp");
//未登录或超时,返回登陆页面
}else{
verifyUrl(url,st);//判断当前user是否拥有访问此url的权限
}
}catch(Exceptionsx){
sx.printStackTrace();
}
}
/**
*判断当前user是否拥有访问此url的权限
*@paramurl
*当前请求的url
*@paramst
*当前登录用户信息
*@throwsIOException
*@throwsServletException
*/
privatevoidverifyUrl(Stringurl,loginst)throwsIOException,
ServletException{
//获取user拥有的所有资源串,此处全部提取出来,以方便以后项目扩展
//更好的方式是把此处的权限页面存储在数据库中,与角色建立关系,以后可以直接根据用户角色从
//数据库中取出
Stringsturl=null;
//拥有权限页1的jsp页面
Stringurl1="";
////拥有权限页2的jsp页面
Stringurl2=""
////拥有权限页3的jsp页面
Stringurl3="";
//拥有权限页4的jsp页面
Stringurl4="";
////拥有权限页5的jsp页面
Stringurl5="";
//拥有权限页6的jsp页面
Stringurl6="";
//公共
Stringurl7="";
sturl=url7;
//以下判断用户是否有进入该页面的权限,有则加入
if("1".equals(st.getKhbfqx())){
sturl=sturl+","+url1;
}
if("1".equals(st.getRcgzqx())){
sturl=sturl+","+url2;
}
if("1".equals(st.getKhzbqx())){
sturl=sturl+","+url3;
}
if("1".equals(st.getKhjgqx())){
sturl=sturl+","+url4;
}
if("1".equals(st.getXtpzqx())){
sturl=sturl+","+url6;
}
if("1".equals(st.getYhglqx())){
sturl=sturl+","+url5;
}
if(sturl.indexOf(url)>=0){
//判断用户权限页面包含请求url里面的页面
chain.doFilter(request,response);
}else{
//用户无权限跳转提示
response.setContentType("text/html;charset=GBK");
response.getWriter().println(" 100auto;text-align: center;" +"font: bold18px宋体;color: #0066CC;vertical-align: middle'>Sorry,您没有权限访问该资源!
}
}
/**
*特殊页面判断
*是否需要判断权限,如客户端浏览、登录页面则不需要判断权限
*/
protectedbooleannoFileUrl(Stringurl,HttpServletRequestrequest){
//不需要权限验证的页面动作等
Stringexclude="xx.jsp";
//判断请求页面是否是特殊页面
if(exclude.indexOf(url)>=0){
returntrue;
}
returnfalse;
}
}
Action权限过滤器permissiondoFilter
packagedao;
importjavax.servlet.Filter;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.FilterChain;
importjava.io.IOException;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpSession;
importjavax.servlet.http.HttpServletResponse;
importpo.login;
publicclasspermissiondoFilterimplementsFilter{
//1,doFilter方法的第一个参数为ServletRequest对象。
//此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。
//第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。
//最后一个参数为FilterChain,此参数用来调用servlet或JSP页。
privateFilterConfigfilterConfig;
privateFilterChainchain;
privateHttpServletRequestrequest;
privateHttpServletResponseresponse;
publicvoiddestroy(){
this.filterConfig=null;
}
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
this.filterConfig=filterConfig;
}
publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,
FilterChainchain){
this.chain=chain;
this.request=(HttpServletRequest)servletRequest;
//如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法,就要把此request对象构造成HttpServletRequest
this.response=((HttpServletResponse)servletResponse);
//获取当前页面文件名此处url为:
/Gzlkh/login.jsp
Stringurl=request.getRequestURI();
//此处截取的url为:
login.jsp
url=url.substring(url.lastIndexOf("/")+1,url.length());
try{
//排除后台不作权限控制的页面名
//登陆页面无需验证文件
HttpSessionsession=request.getSession();
//获取网站访问根目录
StringaccessPath=request.getContextPath();
loginst=(login)session.getAttribute("st");
if(noFileUrl(url,request)){//不需要判断权限的请求如登录页面,则跳过
chain.doFilter(request,response);
}elseif(st==null){
response.sendRedirect(accessPath+"/login.jsp");//返回登陆页面(未登录或超时)
}else{
System.out.println(st.getRolename()+st.getUsername()+"-访问-"+url);
verifyUrl(url,st);//判断当前user是否拥有访问此url的权限
}
}catch(Exceptionsx){
sx.printStackTrace();
}
}
/**
*@paramurl
* 当前请求的url
*@paramuser
* 当前登录用户
*@throwsIOException
*@throwsServletException
*/
privatevoidverifyUrl(Stringurl,loginst)throwsIOException,ServletException{
//获取user拥有的所有资源串
Stringsturl=null;
Stringurl1="";
Stringurl2="";
//考核结果页面
Stringurl3="";
//用户管理页面
Stringurl4="";
//权重配置页面
Stringurl5="";
//个人密码修改公共
Stringurl6="";
sturl=url6;
if("1".equals(st.getRcgzqx())){
sturl=sturl+","+url1;
}
if("1".equals(st.getKhzbqx())){
sturl=sturl+","+url2;
}
if("1".equals(st.getKhjgqx())){
sturl=sturl+","+url3;
}
if("1".equals(st.getXtpzqx())){
sturl=sturl+","+url4;
}
if("1".equals(st.getYhglqx())){
sturl=sturl+","+url5;
}
if(sturl.indexOf(url)>=0){
System.out.println("有权访问!
");
chain.doFilter(request,response);
}else{
System.out.println("无权限!
");
response.setContentType("text/html;charset=GBK");
response.getWriter().println(" 100auto;text-align: center;background-image: url(images/bg.jpg);" +"font: bold18px宋体;color: #0066CC;vertical-align: middle'>Sorry,您没有权限访问该资源!
}
}
/**
*是否需要判断权限,如客户端浏览、登录页面则不需要判断权限
*/
protectedbooleannoFileUrl(Stringurl,HttpServletRequestrequest){
Stringexclude="login.do";
if(exclude.indexOf(url)>=0){
returntru
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- struts 权限 控制