Hello你们好,本章咱们处理先后端分离开发时出现的问题 。有问题能够联系我mr_beany@163.com。另求各路大神指点,感谢
随着技术不断发展,如今愈来愈多的项目开始先后端分离方式进行开发。在传统项目中,shiro登录成功自动保存sessionId到cookie中,后台根据sessionid获取当前登录角色信息。在先后端分离的项目中,因为ip,端口不一致的缘由,致使没法请求后端接口(跨域)和没法在cookie中获取sessionId。本章处理以上两个问题。前端
我这里的前端项目启用的是8800端口,后台启用的是8080端口,因为端口不一致致使在前端经过axios请求时出现以下错误java
解决方案:ios
打开core→configuer→WebConfigurer.javagit
添加以下代码:github
private CorsConfiguration buildConfig() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
//请求方法 config.addAllowedMethod(HttpMethod.GET);
config.addAllowedMethod(HttpMethod.POST);
config.addAllowedMethod(HttpMethod.PUT);
config.addAllowedMethod(HttpMethod.DELETE);
config.addAllowedMethod(HttpMethod.OPTIONS);
return config;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
//处理所有请求路径
configSource.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(configSource);
}复制代码
再次请求:web
请求成功,拿到数据。(忽略辣眼睛的页面)apache
shiro原逻辑是在cookie中获取sessionId,这里咱们修改一下其中的逻辑。axios
登录方法:后端
@Override
public Map<String, Object> userLogin(String userName, String password) {
Subject currentUser = SecurityUtils.getSubject();
currentUser.login(new UsernamePasswordToken(userName, password));
//从session取出用户信息
//UserInfo user = (UserInfo) currentUser.getPrincipal();
Map<String,Object> map = new HashMap<>(3);
map.put("sessionId",currentUser.getSession().getId());
return map;
}复制代码
重写shiro获取sessionid跨域
新建core→shiro→MySessionManager.java
package com.example.demo.core.shiro;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.web.servlet.ShiroHttpServletRequest;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.util.WebUtils;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.Serializable;
/**
* @author zy
*/
public class MySessionManager extends DefaultWebSessionManager {
//请求头的名字
private static final String AUTHORIZATION = "Authorization";
private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request";
public MySessionManager() {
super();
}
@Override
protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
String id = WebUtils.toHttp(request).getHeader(AUTHORIZATION);
//若是请求头中有 Authorization 则其值为sessionId
if (!StringUtils.isEmpty(id)) {
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE);
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
return id;
} else {
//不然按默认规则从cookie取sessionId
return super.getSessionId(request, response);
}
}
}复制代码
修改core→configuer→ShiroConfigurer.java
添加以下代码:
@Bean
public SessionManager sessionManager(){
return new MySessionManager();
}复制代码
以上,能够解决文章开篇提出的两个问题。
码云地址: gitee.com/beany/mySpr…
GitHub地址: github.com/MyBeany/myS…
写文章不易,如对您有帮助,请帮忙点下star