问题
在与深证信息职业学院系统身份认证的时候,该系统默认会在我们的回调地址栏加上;jsessionid=6EEB42B0546A1B057BD37A628CAE646F这个参数,导致我们http://10.10.16.172:8080/csos/f/PCRepairsMobile/getRedict;jsessionid=6EEB42B0546A1B057BD37A628CAE646F 我们的回调地址出现400错误,调用不到http://10.10.16.172:8080/csos/f/PCRepairsMobile/getRedict这个接口
分析:
解决方案1:
可以在回调地址加上?就可以解决该问题,http://10.10.16.172:8080/csos/f/PCRepairsMobile/getRedict? ;jsessionid=6EEB42B0546A1B057BD37A628CAE646F
结果:
1.该系统默认会把我们回调地址?之后的参数加在;jsessionid=6EEB42B0546A1B057BD37A628CAE646F后面,如下形式:http://10.10.16.172:8080/csos/f/PCRepairsMobile/getRedict;jsessionid=6EEB42B0546A1B057BD37A628CAE646F?该地址还是无效形式
解决方案2:
1.可以让对接的认证系统对我们的回调地址返回前缀加上?也可以解决该问题
结果:
1. 对接系统系统也是从其他公司购买的,修改不了代码
解决方案3:
1.通过与必棋的讨论,实际上,只要系统能拦截到400这个地址的请求,就可以对该地址进行修改,或者直接返回
过程
1.先进行demo的测试,查看系统是否可以400这个请求是否可以经过系统。发现是需要请求到系统中的,所以该方案是可以行的。
2. 对该拦截看是使用过滤器(Filter)还是拦截器(Interceptor)
结论:使用拦截器
-
Filter需要在web.xml中配置,依赖于Servlet
-
Interceptor需要在SpringMVC中配置,依赖于框架
-
Filter的执行顺序在Interceptor之前
-
两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。
结果:
1.在web.xml中线进行配置过拦截的地址进行配置,注意:需要注意filter的顺序。
<filter>
<filter-name>My Filter</filter-name>
<filter-class>com.thinkgem.jeesite.modules.sys.interceptor.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>My Filter</filter-name>
<url-pattern>/f/*</url-pattern>
</filter-mapping>
2.实现Filter,实现自己的业务,进行跳转。
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
String requestURI = req.getRequestURI();
//身份认证 web端和移动端做一个地址拦截
if(StringUtils.isNotEmpty(requestURI) && requestURI.contains("PCRepairs/;jsessionid")){
response.sendRedirect("http://10.10.16.172:8080/csos/f/PCRepairs/");
}else if(StringUtils.isNotEmpty(requestURI) && requestURI.contains("getRedict;jsessionid")){
response.sendRedirect(String.format("%s","http://10.10.16.172:9533/#/search"));
}else{
filterChain.doFilter(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
}