[英]spring java: interceptor sendRedirect loop
我实现了一个Interceptor,它可以进行某些检查并将sendRedirect发送到某个页面。 目前,我在没有任何条件的情况下对其进行测试,只需在调用preHandle时简单地执行sendRedirect即可。 这是我的实现:
class HttpInterceptorMgr implements HandlerInterceptor {
public boolean preHandle(HttpServleRequest aRequest, HttpServletResponse aResponse, Object aHandler) {
try {
sendRedirect("/somepage");
return false;
}
catch(Exceptio n e) {
// Do something else
}
}
}
web.xml
<servlet-mapping>
<servlet-name>myproject</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
....
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
myproject-web-servlet.xml
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:interceptors>
<bean class="org.mycompany.HttpInterceptorMgr" />
</mvc:interceptors>
applicationContextSecurityBeans.xml
<security:http auto-config="true" use-expression="true" access-denied-page="/user/denied">
<security:form-login
login-page="/login"
authentication-failure-url="login?error=true"
default-target-url="/homepage" />
<security:logout invalidate-session="true"
logout-success-url="/login"
logout-url="/j_sring_security_logout" />
</security:http>
我面临的问题是我的页面在循环中被重定向。 在firefox浏览器上,显示“页面无法正确重定向”。 我拖尾catalina.out,它显示它多次输入预处理,并且它的request.getRequestUrl是/somepage
。 但我无法成功访问该页面。
发生的事情是因为您的拦截器没有条件,即使对于“ / somepage”的重定向请求,它也再次发送了重定向,这将循环进行。
您可以检查请求是否发往“ / somepage”,这样就不必再次重定向。
class HttpInterceptorMgr implements HandlerInterceptor {
public boolean preHandle(HttpServleRequest aRequest, HttpServletResponse aResponse, Object aHandler) {
try {
if(!aRequest.getRequestURL().toString().endswith("/somepage")) {
sendRedirect("/somepage");
return false;
}
}
catch(Exceptio n e) {
// Do something else
}
return true;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.