处理含有登录地址第二次没退出登录就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会报错
相关推荐
函数返回值类型为 `int`,表示程序的退出状态。 ### 2. 字符串处理 #### 2.1 定义字符数组 程序中定义了两个字符数组 `char name[size];` 和 `char add[size];`,其中 `size` 是一个常量表达式,表示数组大小。这...
15. C语言数组和指针:程序段执行后,输出`s[2]`的值为5,因为`s`是一个指向数组第二个元素的指针。 16. 逻辑运算与三元运算符:在给定的程序段中,当b1为true时,b3的结果为b2的值,而b2未赋值,因此默认为false。...
第二次称重时,将假币所在组再分为两部分,同样比较,找出含有假币的那份,再称一次即可确定真假。 8. **字符串拷贝函数**:`strcpy`用于字符串之间的简单复制,只处理字符串;`sprintf`则更通用,可以将各种类型的...
1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 15 1.29 为什么我的编译器不允许我定义大数组,如double array[256][256]? 15 命名空间 15 1.30 如何判断哪些标识符可以使用,...
第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进入...
1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 1.29 为什么我的编译器不允许我定义大数组,如doublearray[256][256]? 命名空间 1.30如何判断哪些标识符可以使用,哪些被保留了...
第二题提到关闭Word 2000的正确方法,答案是D.单击文件菜单中的“退出”,因为这是正式关闭程序的方式,而A、B、C选项只是最小化或关闭当前文档,并非退出整个程序。 第三题涉及Word文档的默认扩展名,答案是C.DOC...
对于做虚拟主机,可以通过给各Web站点设不同的端口号来实现,比如给一个Web站点设为80,一个设为81,一个设为82……,则对于端口号是80的Web站点,访问格式仍然直接是IP地址就可以了,而对于绑定其他端口号的Web站点...
o 2.8 函数只定义了一次, 调用了一次, 但编译器提示非法重定义了。 o 2.9 main() 的正确定义是什么? void main() 正确吗? o 2.10 对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为 ``...
这个问题涉及到字符串处理和算法设计。一种可能的解决方案是使用滑动窗口方法,从字符串的第一个字符开始,维护一个窗口,每次移动窗口直到找到一个重复的子串。这个过程需要比较窗口内的子串与之前出现过的子串。...
第一次安装教师机后班级模型为空,使所有的学生机都登录到教师机中则班级模型自动建立,您这时再根据您教室和班级的具体情况进行调整就相当方便。 学生机登录后会在班级模型区以图标显示出来,您...
如果使用第三方耗材导致的问题,制造商将不承担责任。 #### 三、附带资料 - **快速指南**:包含常用操作步骤,方便快速上手。 - **安全指南**:提供了安装和使用过程中的安全注意事项。 - **DVD (产品库)**:包含...
原因就在二级域名没有修改为自己的域名,这里主要修改二级域名(静态文件访问地址)。修改完提交保存!然后到生成管理中进行生成,这部分在下面会详细讲到。 3、用户标签管理(usertag.asp) 该功能用途,主要是...