集成jwt修改成restful风格
分类: springboot 专栏: springboot 标签: jwt restful
2025-08-17 14:02:19 157浏览
集成jwt修改成restful风格,诉求直通车项目,springboot2+vue2
<!--JWT 依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency> <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.51</version> </dependency>
package com.jff.suqiu.util;
import io.jsonwebtoken.*;
import java.util.Date;
public class JwtUtils {
/**
* 生成token字符串 xxx.yyy.zzzz
* @param username
* @return
*/
public static String getToken(String username,String role){
return Jwts.builder().setHeaderParam("typ", "JWT")
//过期时间 一个小时后此token就失效了
.setExpiration(new Date(System.currentTimeMillis()+3600*1000*30))
.setSubject(username)
// 添加角色权限信息
.claim("role", role)
.signWith(SignatureAlgorithm.HS256, "jf3q-jwt").compact();
}
public static String getUserName(String token){
String username = null; try { username = Jwts.parser().setSigningKey("jf3q-jwt").parseClaimsJws(token).getBody().getSubject(); } catch ( Exception e) { return null; } return username;
}
//获取角色
public static String getRole(String token){
Claims claims = Jwts.parser().setSigningKey("jf3q-jwt").parseClaimsJws(token).getBody();
String role = claims.get("role", String.class);
return role;
}
}
package com.jff.suqiu.config;
import com.alibaba.fastjson.JSON;
import com.jff.suqiu.bean.SqSyslog;
import com.jff.suqiu.service.SqSyslogService;
import com.jff.suqiu.util.DateUtils;
import com.jff.suqiu.util.JwtUtils;
import com.jff.suqiu.util.MessUntil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Enumeration;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI();
String p = "";
Enumeration enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String paraName = (String) enu.nextElement();
if(paraName.equals("loginRole")){
l.setRole( request.getParameter(paraName));
}else if(paraName.equals("loginRealname")){
l.setRealname( request.getParameter(paraName) );
}else if(paraName.equals("token")){
}else{
p += paraName + ": " + request.getParameter(paraName) + "<br>";
}
}
if(url.indexOf("/front/")>-1)return true;
if(url.indexOf("/common/")>-1)return true;
if(url.indexOf("/upimgs/")>-1)return true;
String token = request.getHeader("token");
if(!StringUtils.hasText(token)){ tokenerror( response); return false; } try { String username=JwtUtil.getUserName(token); if(username!=null&&username.trim().length()>0) return true; tokenerror( response); return false; } catch (Exception e) { tokenerror( response); return false; }
} private void tokenerror(HttpServletResponse response) throws IOException { PrintWriter writer = response.getWriter(); MessUntil mess=new MessUntil(); mess.setStatus(-200); mess.setMsg("token失效,请登录"); String r= JSON.toJSONString(mess); writer.write( r); writer.close(); writer.flush(); }
}
package com.jff.suqiu;
import com.jff.suqiu.config.LoginInterceptor;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.Arrays;
@Configuration
public class MyWebAppConfiguration extends WebMvcConfigurationSupport implements ApplicationContextAware {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("/upimgs/**").addResourceLocations("file:D:/upimgs/");
super.addResourceHandlers(registry);
}
@Bean
public FilterRegistrationBean<CorsFilter> corsFilter(){
FilterRegistrationBean<CorsFilter> corsFilterFilterRegistrationBean=new FilterRegistrationBean<>();
UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration=new CorsConfiguration();
corsConfiguration.addAllowedHeader("*");//允许的请求头
// corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedOriginPattern("*");//允许的origin域名
corsConfiguration.setAllowCredentials(true); //是否允许发cookie
// corsConfiguration.setMaxAge(3600*1000l*30);//从预检请求得到相应的最大时间,默认30分钟
corsConfiguration.setAllowedMethods(Arrays.asList("GET","POST","DELETE","PUT")); //允许的请求方法
source.registerCorsConfiguration("/**",corsConfiguration);//指定可以跨域的路径
corsFilterFilterRegistrationBean.setFilter(new CorsFilter(source));
corsFilterFilterRegistrationBean.setOrder(-1);
return corsFilterFilterRegistrationBean;
}
@Bean
public LoginInterceptor getAccessInterceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor( getAccessInterceptor()) ;
super.addInterceptors(registry);
}
}
package com.jff.suqiu.control.back;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.jff.suqiu.bean.SqType;
import com.jff.suqiu.service.SqTypeService;
import com.jff.suqiu.service.SqTypeSherService;
import com.jff.suqiu.util.DateUtils;
import com.jff.suqiu.util.MessUntil;
import com.jff.suqiu.util.Sys;
import com.jff.suqiu.util.UploadFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@CrossOrigin
@RestController
@RequestMapping("/type")
public class SqTypeController {
@Autowired
SqTypeService typeService;
@Autowired
SqTypeSherService typeSherService;
@PutMapping("/save")
public MessUntil save(@RequestBody SqType o) {
MessUntil mess=new MessUntil();
if(o.getId()==null){
o.setCts(DateUtils.getNowDateTsString());
o.setTimg(Sys.Upimg.noimg);
}
typeService.saveOrUpdate(o);
return mess.succ();
}
@GetMapping("/page")
public MessUntil page(@RequestParam(value="pageNo",defaultValue="1")int pageNo,
@RequestParam(value="pageSize",defaultValue="10")int pageSize, SqType u ) {
MessUntil mess=new MessUntil();
PageHelper.startPage(pageNo,pageSize," id desc ");
List<SqType> li=typeService.getlist(u);
PageInfo<SqType> pageInfo = new PageInfo(li,pageSize);
for(SqType t:pageInfo.getList()){
t.setShnames(typeSherService.getShnamesByTid(t.getId()));
}
return mess.succ(pageInfo);
}
@GetMapping("/list")
public MessUntil list( SqType u ) {
MessUntil mess=new MessUntil();
u.setOrderby("tsort_asc");
List<SqType> li=typeService.getlist(u);
return mess.succ(li);
}
@DeleteMapping("del")
public MessUntil del( Integer id) {
MessUntil mess=new MessUntil();
if(id==null )return mess.error( "参数错误");
SqType ol=typeService.getById(id);
try{
typeService.removeById(id);
}catch (Exception e){
return mess.error( "删除失败,请先删除关联数据");
}
UploadFile.deleteFile(ol.getTimg());
return mess.succ( );
}
}
put,post使用@requestbody,其他直接接受参数
/*
* 登录
* */
@PostMapping("/login")
public MessUntil login(@RequestBody SqUsers o) {
MessUntil m=new MessUntil();
if( o.getPhone()==null || o.getPhone().trim().length()==0)return m.error("请输入手机号");
if( o.getUpass()==null || o.getUpass().trim().length()==0)return m.error("请输入密码");
o.setUpass(MD5Until.getMD5(o.getUpass()));
SqUsers u=usersService.login(o.getPhone(),o.getUpass());
if(u!=null){
u=usersService.getById(u.getId());
if(u.getState().equals("1")){
u.setUpass("");
String token = JwtUtils.getToken(u.getId()+"", u.getRole());
u.setToken(token);//token,jwt产生的token
return m.succ(u);
}else if(u.getState().equals("2")){
return m.error("账号待审核");
} else{
return m.error("该账号被禁用("+u.getMsg()+")");
}
}else{
return m.error("请输入正确的账号和密码");
}
}
// request.js
import axios from 'axios'
import QS from 'qs'; //如果是form表单需要通过qs模块进行序列化数据
import {Message, MessageBox} from "element-ui";
// 一些请求的基本配置
const service = axios.create({
baseURL: process.env.VUE_APP_API_ROOT,// 接口的域名地址
timeout: 20000,
// headers: {"Content-Type": "application/x-www-form-urlencoded;charset=utf-8"}//form表单格式
headers: {"Content-Type": "application/json;charset=utf-8"}
})
service.interceptors.request.use(config => {
try{
let lander=JSON.parse(localStorage.loginUser)
if (lander.token) {
config.headers.token =lander.token;
}
}catch (e) {
}
return config
})
// 输出方法
export default function request(option) {
try{
let lander=JSON.parse(localStorage.loginUser)
option.params.loginRole=lander.role;
option.params.loginRealname=lander.realname ;
}catch (e) {
}
return new Promise((resolve, reject) => {
let options = {
url: option.url,
method: option.method,
responseType: option.responseType || '',
timeout: option.timeout || 20000,
params:{},
data:{},
}
if(option.method === 'get'||option.method === 'delete'){//判断请求方式
delete options.data;
options.params=option.params;
}else{
delete options.params;
// options.data=QS.stringify(Object.assign(option.data));
options.data=JSON.stringify(option.data);
}
service(options)
.then(
res => {
delresult(res)
resolve(res);
},
res => {
if (option.reject) {
delresult(res)
reject(res);
}
})
.catch(error => {
reject()
console.error(error)
})
})
}
function delresult (res){ //统一处理结果
if(res.data.status==-200){
Message.error(res.data.msg);
setTimeout(()=>{
window.location='/ALogin'
},500)
}
if(res.data.status==0){
Message.error(res.data.msg);
}
if(res.data.status==1){
if(res.data.msg) Message.success(res.data.msg );
}
}
export const type_del = (params) => http({
url: '/type/del',
method: 'delete',
params: params
})
export const type_page = (params) => http({
url: '/type/page',
method: 'get',
params: params
})
export const type_add = (data) => http({
url: '/type/save',
method: 'put',
data: data
}) export const type_update = (data) => http({ url: '/type/update', method: 'post', data: data })
export const type_list = (params) => http({
url: '/type/list',
method: 'get',
params: params
})
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
暂无评论,快来写一下吧
展开评论
他的专栏
他感兴趣的技术




java
vue
springboot
Mysql
ssm
小程序
uniapp
js和jquery