各位大神,springmvc自定义视图拦截器没有拦截到后台的jsp页面,如何解决这个问题?

springmvc登录拦截器拦截器起到了作用,跳到了登陆页面,登录页面是通过ajax提交请求给后台的,后台执行完了之后会返回一个map给ajax的success方法,从而进行页面的跳转。可是现在的问题
springmvc 登录拦截器
拦截器起到了作用,跳到了登陆页面,登录页面是通过ajax提交请求给后台的,后台执行完了之后会返回一个map给ajax的success方法,从而进行页面的跳转。可是现在的问题是,后台执行了,但是跳不回前台,map也传回不去,更不说页面的跳转了。
解决方案二:
小机器人已经给你答案了:
1、不要拦截此跳转;
2、登录在后台执行了后,如果登录成功,直接更新一下登录session,这样过滤器就不会拦截了,想跳哪个页就跳哪个页;如果登录不成功,直接再跳转到登录页面。
解决方案三:
这是login.jsp里面js方法
function submitLogin(){
var url = base_path+'login/loginManage';
var validateCode= '${applicationScope.a_cache.sysConfigCache.baseDatas["config_show_login_validate_img"].value}';
var req_data={};
if(validateCode==1){
req_data.authCode = $("#authCode").val();
//alert(validateCode);
var userName=$("#userName").val();
var password =$("#password").val();
loadimage();
//alert(url);
type:"POST",
data:{userName:userName,password:password},
success:function(res){
alert(res);
testJson = eval("(" + res + ")");
if(testJson.flag=="true"){
alert("登陆成功");
window.location = "/Test03"+testJson.
alert("登陆失败");
这是后台接收并处理的方法:
@RequestMapping(value = "/loginManage", method = RequestMethod.POST)
@ResponseBody
public Object login(User user,HttpServletRequest request){
String redirect = request.getParameter("redirect");
String flag="false";
//User resultUser = userService.findByUserAndPassword(user);//核对用户名密码
User resultUser = userService.findByUserAndPasswordForSpring(user);//核对用户名密码
System.out.println("----------------------------"+resultUser);
if (resultUser != null) {
user = resultU
("用户:"+user.getUserName()+"登陆成功");
HttpServletRequest request1 = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
HttpSession session = request1.getSession();
session.setAttribute("session_user", user.getUserName());
flag="true";
}catch (Exception e) {
logger.error(e.getMessage());
e.printStackTrace();
Map&String,Object& map = new HashMap&String,Object&();
map.put("url", "/manage/main");
map.put("ok", "用户登陆成功!");
map.put("flag", flag);
拦截器里这样写的:
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
String requestUri = arg0.getRequestURI();
for (String url : excludedUrls) {
System.out.println("excludedUrls:"+excludedUrls);
System.out.println("requestUri:"+requestUri);
System.out.println(requestUri.endsWith(url));
if (requestUri.endsWith(url)) {
if (arg0.getHeader("x-requested-with") != null && arg0.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
//如果是ajax请求响应头会有,x-requested-with
System.out.print("发生ajax请求...");
HttpSession session = arg0.getSession();
if (session.getAttribute("session_user") == null) {
System.out.println(arg0.getContextPath());
arg1.sendRedirect(arg0.getContextPath() + "/login");
解决方案四:
你先看下这个过滤器方法,就是拦截登录的
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)
HttpServletResponse response = (HttpServletResponse)
HttpSession session = request.getSession();
if (session.getAttribute("currentAdmin") != null) {// 用户已经登录
chain.doFilter(request, response);
String[] fxUrlArray = new String[] { "login.jsp", "login.do","createCode.do" ,"common/ajax.do","/out/","test.jsp","/common/","/clientExam/","/s.do"};// 不被拦截的地址
StringBuffer url = request.getRequestURL();
boolean bs =
for (String fxUrl : fxUrlArray) {
if (url.indexOf(fxUrl) & 0) {// 放过不被拦截的地址
chain.doFilter(request, response);
if (!bs) {// 未登录并且没有在不被拦截的地址里的跳转到登录页面
String contextPath = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":"
+ request.getServerPort() + contextP
response.sendRedirect(basePath + "/jsp/login.jsp");
解决方案五:
你的代码中 将不需要拦截的请求添加到 excludedUrls
这个里边就好了。
解决方案六:
url:contextPath + "/version/getList.do",
type:"POST",
type:type,
pageNo:pageNo
dataType:"json",
。。。。。。
【云栖快讯】支撑千亿营收,阿里如何做研发?淘宝如何做敏捷实践?如何面对开发中的“黑天鹅”事件?6月29日首届阿里研发效能嘉年华,独家直播,赶紧预约吧!&&
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...如何让spring mvc拦截器不拦截对某个jsp的直接访问?【java吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:618,164贴子:
如何让spring mvc拦截器不拦截对某个jsp的直接访问?收藏
spring mvc配置了禁止对jsp页面直接访问的拦截器,如何让spring mvc拦截器不拦截对某个jsp的直接访问?
2017java学习来上市公司博为峰学java,入学即签就业协议,不就业不收费,查看java课程!java好学吗?java课程来博为峰学,java工程师就业年薪十几万!
来个大神教教,这个web.xml应该怎么配置才能实现标题的功能。
。来人喃。
我等的都快睡了。
我等的都快睡了。
已经在百度知道,java中文社区。java贴吧。三处提问都没回答。好悲伤的说。
web.xml加这个试试&servlet-mapping&
&servlet-name&default&/servlet-name&
&url-pattern&xxxxx.jsp&/url-pattern&
&/servlet-mapping&
登录百度帐号推荐应用09:40 提问
spring mvc 为什么不拦截jsp文件?
问题描述:
一个简单的DEMO,在一个s1.jsp页面上提交一个form,发给springMVC的一个controller,然后返回一个s2.jsp显示之前提交的参数。
我在web.xml中,servlet配置的是拦截所有的请求发给springMVC,那为什么我能在浏览器中直接输入url打开s1.jsp(s1.jsp位于WebContent目录下)?如果在相同的目录下放置一个html文件,浏览器中直接输入url则会被拦截。
我不明白为什么springMVC默认不会拦截jsp?在哪里设置的?
按赞数排序
过滤器是按照你配置的规则过滤,如userprefix-*.jsp拦截所有符合*匹配结果的url,如果你想设置过多的过滤规则,大可你实现一个filter,直接在web.xml把该filter配置成*.*过滤规则,然后再在你的doFilter函数中实现你具体的过滤规则,想怎么设置就怎么设置。
谢谢。我知道如何配置拦截请求,但是我搞不懂为什么按照截图里面的配置,没有拦截s1.jsp?
其他相似问题用户名:pangfc
文章数:286
评论数:85
访问量:143424
注册日期:
阅读量:1297
阅读量:3317
阅读量:427663
阅读量:1115707
51CTO推荐博文
关于什么是CSRF我这里就不多说了,以前转载的一篇文章(PS:)已经说得很清楚了。这里只是简单介绍如何在SpringMVC中使用拦截器拦截CSRF攻击。具体代码如下:(1)登录页面:&%@page&import="java.security.SecureRandom"%&
&%@&page&language="java"&contentType="text/&charset=UTF-8"
&&&&pageEncoding="UTF-8"%&
String&path&=&request.getContextPath();
String&basePath&=&request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
&meta&http-equiv="Content-Type"&content="text/&charset=UTF-8"&
&base&href="&%=basePath%&"&
&title&SpringMVC&Cookie&Demo&/title&
SecureRandom&random&=&new&SecureRandom();
random.setSeed(8738);
double&_csrf&=&random.nextDouble();
session.setAttribute("_csrf",&_csrf);
&div&align="center"&
&h2&SpringMVC&Cookie&Demo&/h2&
&form&action="check.html"&method="post"&
&td&用户名:&/td&
&td&&input&type="text"&name="username"&/&&/td&
&td&密码:&/td&
&td&&input&type="password"&name="password"&/&&/td&
&td&&input&name="remember-me"&type="checkbox"&30天内自动登录&/input&&/td&
&td&colspan="2"&align="center"&&input&type="submit"&value="登录"&/&
&input&type="reset"&value="重置"&/&&/td&
&input&type="hidden"&name="_csrf"&value="&%=_csrf&%&"&/&
&/html&从上面的代码可知,为了防止CSRF攻击,因此在form表单里添加了一个隐藏字段“_csrf”,其值是生成的一个随机小数(2)在SpringMVC的配置文件中添加拦截器:&?xml&version="1.0"&encoding="UTF-8"?&
&beans&xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&xmlns:context="http://www.springframework.org/schema/context"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans&
&&&http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
&&&&&&&http://www.springframework.org/schema/context&
&&&&&&&http://www.springframework.org/schema/context/spring-context-4.0.xsd
&&&&&&&http://www.springframework.org/schema/cache&&
&&&&&&&http://www.springframework.org/schema/cache/spring-cache-4.0.xsd&&
&&&&&&&http://www.springframework.org/schema/mvc&
&&&&&&&http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"
&&&&&&&default-lazy-init="true"&
&mvc:annotation-driven&/&
&!--&组件扫描&--&
&context:component-scan&base-package="cn.zifangsky.controller"&/&
&context:component-scan&base-package="cn.zifangsky.manager.impl"/&
&!--&配置直接转发的页面&--&
&mvc:view-controller&path="/login.html"&view-name="login"&/&
&mvc:view-controller&path="/user/callback.html"&view-name="user/callback"&/&
&!--&拦截器&--&
&mvc:interceptors&
&mvc:interceptor&
&!--&对登录操作进行拦截&--&
&mvc:mapping&path="/check.html"/&
&bean&class="cn.zifangsky.interceptor.LoginInterceptor"&/&
&/mvc:interceptor&
&mvc:interceptor&
&!--&对/user/**的请求进行拦截&--&
&mvc:mapping&path="/user/**"/&
&bean&class="cn.zifangsky.interceptor.UserInterceptor"&/&
&/mvc:interceptor&
&/mvc:interceptors&
&!--&视图解析&--&
class="org.springframework.web.servlet.view.InternalResourceViewResolver"&
&property&name="prefix"&value="/WEB-INF/pages/"&/&
&property&name="suffix"&value=".jsp"&/&
&/beans&从上面的代码知道,在这个文件中添加了一个&mvc:interceptors 标签,表示一系列的拦截器集合,然后下面定义了对登录时form表单提交地址“/check.html”进行拦截。下面一行的bean属性就是定义了自定义拦截器的类所在的路径注:后面那个拦截器这里不用管,我在写后面的文章时才会用到(3)自定义拦截器LoginInterceptor:package&cn.zifangsky.
import&javax.servlet.http.HttpServletR
import&javax.servlet.http.HttpServletR
import&javax.servlet.http.HttpS
import&mons.lang3.StringU
import&org.springframework.web.servlet.handler.HandlerInterceptorA
public&class&LoginInterceptor&extends&HandlerInterceptorAdapter&{
&*&用于在登录前验证&_csrf&参数
public&boolean&preHandle(HttpServletRequest&request,&HttpServletResponse&response,&Object&handler)
throws&Exception&{
HttpSession&session&=&request.getSession();
String&_csrfByForm&=&request.getParameter("_csrf");&&//表单中的值
String&_csrfBySession&=&String.valueOf(session.getAttribute("_csrf"));&&//session中的值
session.removeAttribute("_csrf");&&//使用之后从session中删掉
//验证是否存在CSRF攻击
if(StringUtils.isNotBlank(_csrfByForm)&&&&StringUtils.isNotBlank(_csrfBySession)&&&&_csrfByForm.equals(_csrfBySession)){
response.setContentType("text/charset=utf-8");
response.setStatus(403);
//页面友好提示信息
OutputStream&oStream&=&response.getOutputStream();
oStream.write("请不要重复提交请求,返回原始页面刷新后再次尝试!!!".getBytes("UTF-8"));
public&void&afterCompletion(HttpServletRequest&request,&HttpServletResponse&response,&Object&handler,&Exception&ex)
throws&Exception&{
super.afterCompletion(request,&response,&handler,&ex);
}这个自定义拦截器的逻辑很简单,就是把form表单隐藏域“_csrf”中的值和session中的“_csrf”值进行比较。如果二者相同,则说明该请求是从前台form表单中传进来的,而不是其他网站的伪造请求(PS:因为这种方式没法向session中定义“_csrf”参数);同时也防止form表单的重复提交(PS:因为第一次验证过后session中的“_csrf”就已经被移除了,除非前台刷新页面才会重新生成),避免了爆破撞库等安全隐患。当然,为了进一步降低安全隐患,这里的form表单还应该添加复杂的动态验证码。我这里是由于为了让示例更简洁,因此就把这一步给省略了(4)验证:第一次提交表单,发现可以正常到达后台进行验证第二次点击浏览器的“返回键”,返回到表单页面之后重复提交,可以发现直接被拦截了。效果如下:PS:上面图片中的水印是我个人博客的域名,因此还请管理员手下留情不要给我标为“转载文章”,谢谢!!!
了这篇文章
类别:┆阅读(0)┆评论(0)springmvc 拦截器,不拦截jsp文件 - 技术先锋 - 博客园
spring mvc的拦截器只拦截controller不拦截jsp文件,如果不拦截jsp文件也会给系统带安全性问题。
解决方案有两种:
1、将所有的jsp文件放入到WEB-INF文件夹下,这样用户是直接不能访问WEB-INF文件下的jsp文件的。spring mvc的理念也是通过controller里的@RequestMapping来请求相关jsp页面,而非用户直接访问jsp页面。
接下去写相关的配置
在springmvc.xml中加入
&mvc:interceptors&
&mvc:interceptor&
&mvc:mapping path="/**"/&
&mvc:exclude-mapping path="/admin/login.do"/&&!--排除拦截页面--&
&bean class="com.ms.controller.LoginInterceptor"&&/bean&
&/mvc:interceptor&
&/mvc:interceptors&
public class LoginInterceptor implements HandlerInterceptor {
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
public boolean preHandle(HttpServletRequest req, HttpServletResponse res,
Object handler) throws Exception {
HttpSession session=req.getSession();
Object obj=session.getAttribute("userId");
if(obj==null||obj.toString().equals("")){
req.getRequestDispatcher("/admin/login.do").forward(req, res);
return false;
return true;
在contoller层
@Controller
@RequestMapping("/admin")
public class AdminController {
@RequestMapping("/login")
public String login(){
return "/WEB-INF/jsp/admin/login.jsp";
以上可以解决spring mvc拦截jsp页面问题
2、还有一种解决方案:jsp如果不放在WEB-INF文件下,spring mvc是无法拦截的,这种请情况下需要用最原始的servlet的Filter接口,具体可以参照
以下博客不再赘述。
http://blog.csdn.net/lsx/article/details/
http://blog.csdn.net/jkeven/article/details/8715833

我要回帖

更多关于 springmvc 自定义view 的文章

 

随机推荐