[置顶] react +webpack+express router实现登录与页面跳转
2017-12-25 09:54
441 查看
2、webpack多入口配置
2.1在webpack.config.js中配置entry
var webpack = require('webpack'); var path = require('path'); //公共文件打包到common.js中 var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common.js',['main','login']); module.exports = { cache: true, entry: { //登陆后进入的主页面 main: './src/index.js', //登录页面 login:'./src/login.js', }, output: { //输出到公共文件public/build下 path: path.resolve(__dirname, 'public/build'), //名称也就是对应的main.js和login.js filename: '[name].js', }, module: { loaders: [ { test: /\.jsx?$/, loader: 'babel', exclude: /(node_modules|bower_components)/, query: { presets: ['react', 'es2015', 'stage-0'] } }, { test: /\.css$/, loader: 'style-loader!css-loader' }, { test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192' }, { test: /\.(woff|eot|ttf|svg)$/, // Have to configure fonts loaders for the generated fonts,视频播放中出现的文字样式不识别 loader: 'url', } ] }, resolve: { extensions: ['', '.js', '.jsx', '.css', '.json'], }, plugins: [ //动态刷新引擎 new webpack.HotModuleReplacementPlugin(), new webpack.NoErrorsPlugin(), // 公共文件打包引擎 commonsPlugin ] };
2.2在express app中配置动态打包
var express = require('express'); var path = require('path'); var app = express(); //热更新模块 if (process.env.NODE_ENV !== 'production') { var webpack = require('webpack'); var webpackConfig = require('./webpack.config.js'); var webpackCompiled = webpack(webpackConfig); // 配置运行时打包 var webpackDevMiddleware = require('webpack-dev-middleware'); app.use(webpackDevMiddleware(webpackCompiled, { //暂存的检测更新的打包文件放入publicPath中,因此需要额外注意publicPath和webpack.config.js中配置的output的path相同,仅需要最后的一个文件夹build publicPath: "/build/", stats: { colors: true }, lazy: false, watchOptions: { aggregateTimeout: 300, poll: true }, })); // 配置热更新 var webpackHotMiddleware = require('webpack-hot-middleware'); app.use(webpackHotMiddleware(webpackCompiled)); }
3、模板引擎jade文件与app文件引用jade文件
3.1view文件夹中的布局文件layout.jade、登录布局login.jade、主页面index.jade
3.1.1 layout.jade
doctype html html head title= title //公共文件的引入 script(src='/build/common.js') body //body中划分区块,供其他需要的jade引用 block content
3.1.2 login.jade
//引入layout.jade extends layout //引入body的布局 block content //声明react-container块,供react DOM绑定 #react-container //文件来源是打包文件/build/login.js script(src='/build/login.js')
3.1.3 index.jade
extends layout block content #react-container script(src='/build/main.js')
3.2 app中引入j
b156
ade模板引擎
// view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade');
4、react使用form提交登录信息
import React, { Component } from 'react'; import ReactDOM from 'react-dom'; class Login extends Component { render() { return ( <form action="/login" method="post">//提交表单信息至app中 <div> <label>Username:</label> <input type="text" name="username" /><br /> </div> <div> <label>Password:</label> <input type="password" name="password" /> </div> <div> <input type="submit" value="Submit" /> </div> </form> ); } } export default Login; ReactDOM.render( <Login />, document.getElementById("react-container") );
5、express app 利用passport实现登录验证与跳转
var express = require('express'); var app= express(); var passport = require('passport'); var Strategy = require('passport-local').Strategy; //react提交的表单信息进行验证 passport.use(new Strategy( function (username, password, done) { if(username == 'test' && password =='test'){ done(null,{id:1234,name:username});//done相当于一个缓存器,接下来在passort中serializeUser中取出 }else { console.log('no user'); done(null, false, { message: 'Incorrect username.' }) } })); passport.serializeUser(function (user, done) { let sessioninfo = { uid: user.id, username: user.name } done(null, sessioninfo);//页面跳转前的session存储 }); //加载下一页面是的session存储 passport.deserializeUser(function (user, done) { if (user != null) { done(null, user); } else { console.log('no user'); done(null, false, { message: 'Incorrect userid.' }) } }); //app在任何时候均会加载这个文件,对这个文件进行限制,即可完成跳转 app.use(function (req, res, next) { if (req.url != '/login' && (!req.session || !req.session.passport || !req.session.passport.user)) { res.redirect('/login'); } next(); }) //主页面/,进入jade中的index app.get('/', function (req, res) { res.render('index', { title: 'index', user: JSON.stringify(req.session.passport) }); }); app.get('/login', function (req, res) { res.render('login'); }); //获取react中form提交的表单信息,利用passport.authenticate进行验证 app.post('/login', function (req, res, next) { passport.authenticate('local', function (err, user, info) { if (err) { return next(err); } //验证失败,仍在login页面 if (!user) { return res.redirect('/login'); } req.logIn(user, function (err) { if (err) { return next(err); } //验证成功跳转到主页面 return res.redirect('/'); }); })(req, res, next); }) app.get('/me', function (req, res) { console.log(req.url); console.log(req.session); console.log(req.session.passport); res.send(JSON.stringify(req.session.passport)); }) app.get('/logout', function (req, res) { req.logout(); res.redirect('/'); }); module.exports = app;
6、react主页面获取用户信息
import React, { Component } from 'react'; import ReactDOM from 'react-dom'; import $ from 'jquery'; export default class Index extends Component { constructor(props, context) { super(props, context); this.state={ username:null, uid:null, } } //再次通过api获取express 中的session信息 componentWillMount() { $.ajax({ url: "/me", method: "GET", success: function (data) { data=JSON.parse(data); console.log(data); this.setState({ username:data.user.username, uid:data.user.uid, }) }.bind(this), error: function (xhr, status, err) { console.log(err); }.bind(this) }); } render() { return ( <div> <p>username:{this.state.username}</p> <a href="/logout">Log out</a> </div> ) }} ReactDOM.render( <Index />, document.getElementById("react-container") );
7、结束语
通过webpack打包、react与jade文件映射、express router作为路由,实现了登录、验证、session缓存、主页面获取登录信息一系列流程,希望此篇文章对你有所帮助。相关文章推荐
- laravel 返回登陆前浏览的页面实现(登录重构后的登录跳转)
- servlet中实现提示登录成功后跳转到某一页面
- android应用 4000 首次登录前实现页面跳转
- 图片上传及登录跳转不同页面功能实现简述
- Struts2透过自定义拦截器实现登录之后跳转到原页面
- Spring Security4.1.3实现拦截登录后向登录页面跳转方式(redirect或forward)返回被拦截界面
- struts2实现登录后跳转回本页面
- 新建一个登录,找回密码,注册页面的工程,使用控制器实现三个页面的跳转
- 在ASP.NET登录页面中如何实现文本框焦点自动跳转及通过回车键提交表单
- 怎么实现登录之后跳转到登录之前的页面?SpringMVC+Freemarker
- ssm中登录功能的实现以及页面跳转
- 普元 EOS Platform 7.6 sso集成业务应用实现单点登录,但登录跳转到成功页面时,经常出现闪屏问题,每秒10次以上
- 重写ajax方法实现异步请求session过期时跳转登录页面
- vue实现登录后页面跳转到之前页面
- 在jquery mobile中页面跳转的时候,实现登录检查
- 使用Shiro实现登录成功后跳转到之前的页面
- 在jsp中怎么实现登录后自动跳转到登陆前浏览页面
- 对话框dialog登录之后,Jquery实现页面定时跳转
- ssm中登录功能的实现以及页面跳转
- Struts2通过自己定义拦截器实现登录之后跳转到原页面