springboot日常

/ springboot / 2 条评论 / 1297浏览

springboot日常使用

登录拦截器
springboot打包部署

自定义登录拦截器

1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口.
2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法.
3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加).

实现HandlerInterceptor

/**
 * @author langao_q
 * @create 2019-12-18 15:20
 * 登录拦截器:校验是否登录
 * 1.preHandle:在业务处理器处理请求之前被调用(常用)
 * 2.postHandle:在业务处理器处理请求执行完成后,生成视图之前执行(少)
 * 3.afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等(少)
 */
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        HttpSession session = httpServletRequest.getSession();
        String contextPath = httpServletRequest.getServletContext().getContextPath();
        //需要登录的页面url
        String[] requireAuthPages = new String[]{
                "buy",
                "alipay",
                "payed",
                "cart",
                "bought",
                "confirmPay",
                "orderConfirmed",

                "forebuyone",
                "forebuy",
                "foreaddCart",
                "forecart",
                "forechangeOrderItem",
                "foredeleteOrderItem",
                "forecreateOrder",
                "forepayed",
                "forebought",
                "foreconfirmPay",
                "foreorderConfirmed",
                "foredeleteOrder",
                "forereview",
                "foredoreview"
        };

        //当前请求的url
        String uri = httpServletRequest.getRequestURI();

        //去掉指定字符串
        uri = StringUtils.remove(uri, contextPath + "/");
        String page = uri;

        //判断是否是属于需要登录的url
        if(beginWith(page, requireAuthPages)){
            //校验用户是否登录
            User user = (User) session.getAttribute("user");
            if(user == null){
                httpServletResponse.sendRedirect("login");
                return false;
            }
        }

        return true;
    }

    /**
     * 比较page是否存在于requiredAuthPages中
     * startsWith() 方法用于检测字符串是否以指定的前缀开始。
     * @param page
     * @param requiredAuthPages
     * @return
     */
    private boolean beginWith(String page, String[] requiredAuthPages){
        boolean result = false;
        for(String requiredAuthPage : requiredAuthPages){
            if(StringUtils.startsWith(page, requiredAuthPage)){
                result = true;
                break;
            }
        }
        return result;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

配置mvc

/**
 * @author langao_q
 * @create 2019-12-18 15:40
 * web mvc配置类
 */
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {

    /**
     * 注册登录拦截器(实例化)
     * @return
     */
    @Bean
    public LoginInterceptor getLoginIntercepter(){
        return new LoginInterceptor();
    }

    /**
     * 指定拦截器的拦截url
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getLoginIntercepter())
                .addPathPatterns("/**");
    }
}

springboot打包/部署

打包

mvn clean package

打包报错:Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project tmall: There are test failures.

mvn clean package -Dmaven.test.skip=true

java命令启动

java -jar 项目.jar

部署-bat启动文件

@echo off
@echo off
start cmd /k "cd /D %~dp0&&java -jar jar名称"
set JAVA_HOME=D:/project/audit/jdk-12.0.1
set Path=%JAVA_HOME%/bin;
java -jar jar名称 --spring.profiles.active=prod

start.sh启动文件

echo ""
echo "[信息] 运行Web工程。"
echo ""
APP_BASE_PATH=$(cd `dirname $0`; pwd)
SPRING_BOOT_OPTS="$SPRING_BOOT_OPTS --spring.profiles.active=dev"

# 优化JVM参数
JAVA_OPTS="$MAVEN_OPTS -Xms128m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -Ddolphin.conf=file:$APP_BASE_PATH/ -Ddolphin.log.path=$APP_BASE_PATH"
JAVA_OPTS="$JAVA_OPTS -Ddolphin.base.path=$APP_BASE_PATH"
if [ -z "$JAVA_HOME" ]; then
  RUN_JAVA=java
else
  RUN_JAVA="$JAVA_HOME"/bin/java
fi

# 根据情况修改 web.war 为您的 war 包名称
exec nohup $RUN_JAVA $JAVA_OPTS -jar $APP_BASE_PATH/xxx.jar $SPRING_BOOT_OPTS > nohup.out & 

stop.sh启动文件

APP_BASE_PATH=$(cd `dirname $0`; pwd)
echo $APP_BASE_PATH
ps -ef | grep $APP_BASE_PATH | grep java |grep -v grep | awk '{print $2}' | xargs kill -9

restart.sh启动文件

APP_BASE_PATH=$(cd `dirname $0`; pwd)
echo $APP_BASE_PATH
ps -ef | grep $APP_BASE_PATH | grep java |grep -v grep | awk '{print $2}' | xargs kill -9
sh ./start.sh

startall.sh

#!/bin/sh
JAVA_EXE=$(command -v java)
NAMES=(
	idh-register
	idh-admin
	idh-config
) 
for name in ${NAMES[@]}; do
$JAVA_EXE -jar -Xms512m -Xmx1024m "/data/idh/server/${name}.jar" > "/data/idh/server/logs/${name}.log" &
sleep 5
done

stopall.sh

#!/bin/sh
NAMES=(
	idh-register
	idh-admin
	idh-config
idh-swagger
)

for name in "${NAMES[@]}"; do
  JAR_NAME="${name}.jar"
  # 使用 pgrep 命令查找正在运行的 Java 进程的 PID
  PID=$(pgrep -f "$JAR_NAME")
  
  if [ -n "$PID" ]; then
    echo "Stopping $name (PID $PID)..."
    kill "$PID"
    echo "$name stopped."
  else
    echo "$name may not be running."
  fi
done

事务

声明式事务

@Transactional(propagation= Propagation.REQUIRED,rollbackForClassName="Exception")
属性类型描述
valueString可选的限定描述符,指定使用的事务管理器
propagationenum: Propagation定义事务的生命周期,有REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED,详细含义可查阅枚举类
isolationenum: Isolation可选的事务隔离级别设置,决定了事务的完整性
readOnlyboolean读写或只读事务,默认读写
timeoutint (in seconds granularity)事务超时时间设置
rollbackForClass对象数组,必须继承自Throwable导致事务回滚的异常类数组
rollbackForClassName类名数组,必须继承自Throwable导致事务回滚的异常类名字数组
noRollbackForClass对象数组,必须继承自Throwable不会导致事务回滚的异常类数组
noRollbackForClassName类名数组,必须继承自Throwable不会导致事务回滚的异常类名字数组

在SpringBoot中,建议采用注解@Transactional进行事务的控制。

前后端分离跨域解决

@Configuration
public class WebConfigurer implements WebMvcConfigurer {

    /**
     * 前后端分离:跨域问题解决
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 所有的当前站点的请求地址,都支持跨域访问。
        registry.addMapping("/**")
                // 当前站点支持的跨域请求类型是什么。
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                // 是否支持跨域用户凭证
                .allowCredentials(true)
                // 所有的外部域都可跨域访问。 如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名
                .allowedOrigins("*")
                // 超时时长设置为1小时。 时间单位是秒。
                .maxAge(60);
    }
}