集成jwt修改成restful风格

无敌的宇宙
无敌的宇宙
擅长邻域:Java,HTML,JavaScript,MySQL,支付,退款,图片上传

分类: springboot 专栏: springboot 标签: jwt restful

2025-08-17 14:02:19 156浏览

集成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展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695