Spring Boot中如何在Ajax成功时重定向并授权返回JSP的URL?
首先,咱们先揪出你当前代码里的一个明显冗余点:你完全没必要通过Ajax请求再重定向。你的需求是点击图标跳转到/home页面,直接让浏览器发起页面跳转就够了——浏览器会自动带上会话相关的认证信息(比如JSESSIONID Cookie),Spring Security能正常识别这个会话的认证状态,不会触发认证错误。
最简单的修复方案
把你的handleClick函数改成直接跳转,去掉多余的Ajax请求:
function handleClick(){ window.location='<%= contextPath %>/home'; }
这样修改后,点击图标就会直接触发浏览器的页面跳转,Spring Security会通过会话Cookie验证你的认证状态,不会再弹出认证要求的错误。
如果你一定要保留Ajax请求(不推荐)
如果因为特殊需求必须用Ajax请求,那咱们得排查几个核心问题:
1. 确认Token的正确性和格式
- 先检查
${sessionScope.token}在JSP中是否能正确取值:可以在页面上临时添加<p>当前Token: ${sessionScope.token}</p>,看看是否输出了有效的认证Token。 - 如果你的Spring Security用的是JWT认证,Authorization头的格式必须是
Bearer <token>,比如:
少了headers: { 'Authorization':'Bearer ${sessionScope.token}' },Bearer前缀的话,Spring Security的JWT过滤器可能无法识别这个Token。
2. 处理CSRF保护
Spring Security默认开启了CSRF保护,Ajax请求如果没携带CSRF Token,会被拦截(虽然你的错误提示是认证问题,但也有可能是CSRF拦截导致的间接错误)。你需要在Ajax请求中添加CSRF Token:
function handleClick(){ $.ajax({ url: "<%=contextPath%>/home", headers: { 'Authorization':'Bearer ${sessionScope.token}', 'X-CSRF-TOKEN': '${_csrf.token}' // 添加CSRF Token }, type: 'GET', success: function(data){ window.location='<%= contextPath %>/home'; }, error:function(e){ console.log(e); } }); }
3. 检查Spring Security配置
确保你的Spring Security配置中,/home路径的GET请求允许已认证用户访问,比如:
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/home").authenticated() // 确保/home需要认证,且已认证用户能访问 .anyRequest().authenticated(); }
为什么原来的代码会报错?
你原来的Ajax请求中,要么是Token没有正确传递(比如取值为空、格式错误),要么是Ajax请求没带上Spring Security需要的认证信息(比如会话Cookie或者CSRF Token),导致Spring Security认为这个请求未认证,所以抛出"full authentication is required for the request"错误。而直接浏览器跳转时,会自动带上会话Cookie,所以认证是有效的。
内容的提问来源于stack exchange,提问作者Kaustabh Nag

