`
y806839048
  • 浏览: 1118465 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

处理含有登录地址第二次没退出登录就404的问题

阅读更多

 

 

处理含有登录地址第二次没退出登录就404的问题

 

 

 

public class MyAuthenticationFilter extends FormAuthenticationFilter{

 

 

 

AdviceFilter

 

 

 public void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {

        Exception exception = null;

 

        try {

            boolean e = this.preHandle(request, response);

            if(log.isTraceEnabled()) {

                log.trace("Invoked preHandle method.  Continuing chain?: [" + e + "]");

            }

 

            if(e) {

                this.executeChain(request, response, chain);//含有登录地址的请求不走这里,就不会404,不走这里之前有登录还是登录,只是控制个跳转到登陆不会导致404

            }

 

            this.postHandle(request, response);

            if(log.isTraceEnabled()) {

                log.trace("Successfully invoked postHandle method");

            }

        } catch (Exception var9) {

            exception = var9;

        } finally {

            this.cleanup(request, response, exception);

        }

 

    }

 

 

自己的默认或抽象,别人复写时使用

 

 

AccessControlFilter

 

public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {

        return this.isAccessAllowed(request, response, mappedValue) || this.onAccessDenied(request, response, mappedValue);

    }

 

 

 

 

AuthenticatingFilter

校验登录地址不允许,只允许除此之外有权限的地址

protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {

        return super.isAccessAllowed(request, response, mappedValue) || !this.isLoginRequest(request, response) && this.isPermissive(mappedValue);

    }

 

    为了处理第二次登录(没有退出),出现404这里在做一次过滤(只要有登录地址的就不允许向内部访问)

@Override

protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {

Subject subject = this.getSubject(request, response);

boolean flag= subject.isAuthenticated();(没退出为true)

return (flag && !((HttpServletRequest)request).getServletPath().contains("j_acegi_security_check")) || !this.isLoginRequest(request, response) && this.isPermissive(mappedValue);

}

 

 

 

protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {

        AuthenticationToken token = this.createToken(request, response);

        if(token == null) {

            String e1 = "createToken method implementation returned null. A valid non-null AuthenticationToken must be created in order to execute a login attempt.";

            throw new IllegalStateException(e1);

        } else {

            try {

                Subject e = this.getSubject(request, response);

                e.login(token);

                return this.onLoginSuccess(token, e, request, response);

            } catch (AuthenticationException var5) {

                return this.onLoginFailure(token, var5, request, response);

            }

        }

    }

 

 

 

//处理直接get请求登录的问题(浏览器直接输入登录地址请求)

 

 

@Override

protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {

HttpServletRequest request = (HttpServletRequest) servletRequest;

HttpServletResponse response = (HttpServletResponse) servletResponse;

//String requestType = request.getHeader("X-Requested-With");

String requestType = (request.getHeader("X-Requested-With")==null?request.getHeader("x-requested-with"):null);

String contentType = request.getHeader("content-type");

request.getHeaderNames();

if ((requestType != null && requestType.equalsIgnoreCase("XMLHttpRequest"))||(contentType!=null && (contentType.equalsIgnoreCase("application/json; charset=utf-8")||contentType.equalsIgnoreCase("application/json")))) {

 

response.addHeader("loginStatus", "accessDenied");

response.sendError(HttpServletResponse.SC_FORBIDDEN);

response.setCharacterEncoding("UTF-8");

response.setContentType("application/json");

//HttpServletResponse rs=new HttpServletResponse();

//response.

//ServletServerHttpResponse responseHeader = new ServletServerHttpResponse(rs);

//responseHeader.getHeaders().add("loginStatus", "accessDenied");

//response.getWriter().write(JSONObject.toJSONString(responseHeader));

//ServletServerHttpResponse.ServletResponseHttpHeaders responseHeader=new ServletServerHttpResponse.ServletResponseHttpHeaders();

//responseHeader.

return false;

}

//if ((requestType != null && requestType.equalsIgnoreCase("XMLHttpRequest"))) {

//

//response.addHeader("loginStatus", "accessDenied");

//response.sendError(HttpServletResponse.SC_FORBIDDEN);

//response.setCharacterEncoding("UTF-8");

//response.setContentType("application/json");

////HttpServletResponse rs=new HttpServletResponse();

////response.

////ServletServerHttpResponse responseHeader = new ServletServerHttpResponse(rs);

////responseHeader.getHeaders().add("loginStatus", "accessDenied");

////response.getWriter().write(JSONObject.toJSONString(responseHeader));

//return false;

//}

String method = request.getMethod();

if("GET".equalsIgnoreCase(method)){

WebUtils.issueRedirect(request, response, "/");

return false;

}

return super.onAccessDenied(request, response);

}

 

}

 

 注意

MyAuthenticationFilter中onLoginSuccess中的session.stop();需要注掉,否则用框架的登陆走了onLoginSuccess然后又清了session会报错

分享到:
评论

相关推荐

    C Primer Plus 练习题第二章第一题

    函数返回值类型为 `int`,表示程序的退出状态。 ### 2. 字符串处理 #### 2.1 定义字符数组 程序中定义了两个字符数组 `char name[size];` 和 `char add[size];`,其中 `size` 是一个常量表达式,表示数组大小。这...

    2021-2022计算机二级等级考试试题及答案No.15953.docx

    15. C语言数组和指针:程序段执行后,输出`s[2]`的值为5,因为`s`是一个指向数组第二个元素的指针。 16. 逻辑运算与三元运算符:在给定的程序段中,当b1为true时,b3的结果为b2的值,而b2未赋值,因此默认为false。...

    大公司的软件笔试试题供参考

    第二次称重时,将假币所在组再分为两部分,同样比较,找出含有假币的那份,再称一次即可确定真假。 8. **字符串拷贝函数**:`strcpy`用于字符串之间的简单复制,只处理字符串;`sprintf`则更通用,可以将各种类型的...

    《你必须知道的495个C语言问题》

    1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 15 1.29 为什么我的编译器不允许我定义大数组,如double array[256][256]? 15 命名空间 15 1.30 如何判断哪些标识符可以使用,...

    东北大学(本部)18秋学期《计算机应用基础》在线作业2答案.docx

    第4题,在 Word 中,不能退出 Word 环境的操作是单击”文件"菜单中的"关闭"命令,因为这只是关闭当前文档,而不是退出 Word 环境。 Excel 第5题,在 Excel 中,各运算符号的优先级由高到低顺序为引用运算符、算术...

    文章管理系统

    4.[纠正]纠正前台导航下拉二级菜单多次经过会出现重复伸缩问题 5.[纠正]选择服务器文件页面没有滚动条的BUG 2014年03月07日 V2.82更新包 1.[新增]会员投稿管理也加入复制功能 2.[改进]改进后台文章管理 缩略图示意...

    计算机应用技术(实用手册)

    解决方法:打开机箱,把主板上的一节纽扣电池取出,换上一节新的既可,或是CMOS被放电了,从新进入CMOS设置时间保存并退出就可解决此问题。 Press F1 tocontinue ,DEL to enter SETUP 按F1可以继续启动,按DEL进入...

    你必须知道的495个C语言问题

    1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 1.29 为什么我的编译器不允许我定义大数组,如doublearray[256][256]? 命名空间 1.30如何判断哪些标识符可以使用,哪些被保留了...

    计算机基础考试题.pdf

    第二题提到关闭Word 2000的正确方法,答案是D.单击文件菜单中的“退出”,因为这是正式关闭程序的方式,而A、B、C选项只是最小化或关闭当前文档,并非退出整个程序。 第三题涉及Word文档的默认扩展名,答案是C.DOC...

    IIS6.0 IIS,互联网信息服务

    对于做虚拟主机,可以通过给各Web站点设不同的端口号来实现,比如给一个Web站点设为80,一个设为81,一个设为82……,则对于端口号是80的Web站点,访问格式仍然直接是IP地址就可以了,而对于绑定其他端口号的Web站点...

    C语言FAQ 常见问题列表

    o 2.8 函数只定义了一次, 调用了一次, 但编译器提示非法重定义了。 o 2.9 main() 的正确定义是什么? void main() 正确吗? o 2.10 对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为 ``...

    最全c++笔试

    这个问题涉及到字符串处理和算法设计。一种可能的解决方案是使用滑动窗口方法,从字符串的第一个字符开始,维护一个窗口,每次移动窗口直到找到一个重复的子串。这个过程需要比较窗口内的子串与之前出现过的子串。...

    多媒体教室

    第一次安装教师机后班级模型为空,使所有的学生机都登录到教师机中则班级模型自动建立,您这时再根据您教室和班级的具体情况进行调整就相当方便。 学生机登录后会在班级模型区以图标显示出来,您...

    京瓷6500i.8000i操作手册

    如果使用第三方耗材导致的问题,制造商将不承担责任。 #### 三、附带资料 - **快速指南**:包含常用操作步骤,方便快速上手。 - **安全指南**:提供了安装和使用过程中的安全注意事项。 - **DVD (产品库)**:包含...

    仿世纪佳缘婚介交友系统5.3 ASP+SQL

    原因就在二级域名没有修改为自己的域名,这里主要修改二级域名(静态文件访问地址)。修改完提交保存!然后到生成管理中进行生成,这部分在下面会详细讲到。 3、用户标签管理(usertag.asp) 该功能用途,主要是...

Global site tag (gtag.js) - Google Analytics